package notice.service.impl;

import lombok.extern.slf4j.Slf4j;
import notice.dto.OrderNoticeDto;
import notice.service.Observer;
import notice.util.IdempotentUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @description: 扣款通知：扣款重试处理
 * @author: zk
 * @since: 2022-08-17 10:19
 */
@Slf4j
@Service
public class DeductionRetryHandler implements Observer {
    //@Resource
    //private CarDeductionRecordServiceImpl carDeductionRecordServiceImpl;
    //@Resource
    //private MailServiceUtil mailServiceUtil;
    //@Value("${mail.toEmil}")
    //private String toEmil;
    //@Resource
    //private CarDeductionRecordDao carDeductionRecordDao;
    //@Resource
    //private TruckDeductionRecordDao truckDeductionRecordDao;
    //@Resource
    //private TruckDeductionRecordSubMapper truckDeductionRecordSubMapper;
    //@Resource
    //private TruckDeductionRecordMergeMapper truckDeductionRecordMergeMapper;
    @Resource
    private IdempotentUtil idempotentUtil;

    @Override
    public void update(OrderNoticeDto notice) {
        log.info("扣款通知-扣款重试处理 notice={}", notice);
        // 幂等检查
        if (idempotentUtil.idempotentCheck(this.getClass(), notice.getOrderNo())) {
            log.warn("扣款通知-垫资处理 该记录已经处理过 notice={}", notice);
            return;
        }

        // 客车
//        if(OrderNoticeDto.ORDER_TYPE_CAR.equals(notice.getOrderType())) {
//            // 微信扣款重试处理
//            if(CarDeductionRecord.CHANNEL_WX.equals(notice.getCurrPayChannel())) {
//                carWXDeductionRetry(notice);
//            }
//        } else {// 货车
//            // 微信扣款重试处理
//            if(TruckDeductionRecord.CHANNEL_WX.equals(notice.getCurrPayChannel())) {
//                truckWXDeductionRetry(notice);
//            }
//        }

        //  幂等表-有效期一周
        idempotentUtil.addIdempotentRecord(this.getClass(), notice.getOrderNo(), 7 * 24 * 60 * 60L);
    }
//
//    private void truckWXDeductionRetry(OrderNoticeDto notice) {
//        log.info("扣款通知-扣款重试处理-货车微信扣款 notice={}",notice);
//        if (!TruckDeductionRecord.DEFAULT_STATUS.equals(notice.getRetryStatus())) {
//            //处理重试成功的订单的状态
//            if (TruckDeductionRecord.PAY_STATUS_SUCCES.equals(notice.getRetryStatus())) {
//                Integer walletOffset = TruckDeductionRecord.DEFAULT;
//                //如果账单重试成功需要冲抵 则设置为待冲抵
//                if (TruckDeductionRecord.SUCCESS_WALLET_OFFSET.equals(notice.getWalletOffset())) {
//                    walletOffset = TruckDeductionRecord.STAY_WALLET_OFFSET;
//                }
//                Integer successStatus = null;
//                Date successPayTime = null;
//                //如果支付状态不是成功或者是申请成功
//                if (!TruckDeductionRecord.PAY_STATUS_SUCCES.equals(notice.getRetryStatus())
//                        && !TruckDeductionRecord.PAY_APPLY_SUCCESS.equals(notice.getRetryStatus())) {
//                    successStatus = notice.getPayStatus();
//                    successPayTime = notice.getPaySuccessTime();
//                }
//                updateRetryInfo(notice, walletOffset, successStatus, successPayTime);
//            }
//        }
//    }
//
//    private void updateRetryInfo(OrderNoticeDto notice, Integer walletOffset, Integer successStatus, Date successPayTime) {
//        // 分发处理
//        switch (notice.getOrderType()) {
//            // 货车原账单
//            case DeductionNoticeDto.ORDER_TYPE_TRUCK:
//                truckUpdate(notice, walletOffset, successStatus, successPayTime);
//                break;
//            // 货车拆分账单
//            case DeductionNoticeDto.ORDER_TYPE_TRUCK_SPLIT:
//                truckSubUpdate(notice, walletOffset, successStatus, successPayTime);
//                break;
//            // 货车合并账单
//            case DeductionNoticeDto.ORDER_TYPE_TRUCK_MERGE:
//                truckMergeUpdate(notice, walletOffset, successStatus, successPayTime);
//                break;
//        }
//    }
//
//    private void truckMergeUpdate(OrderNoticeDto notice, Integer walletOffset, Integer successStatus, Date successPayTime) {
//        TruckDeductionRecordMerge entity = new TruckDeductionRecordMerge();
//        entity.setId(notice.getId());
//        entity.setPaySuccessTime(successPayTime);
//        entity.setPayStatus(successStatus);
//        entity.setPayChannel(TruckDeductionRecord.CHANNEL_WX);
//        entity.setRetryStatus(TruckDeductionRecordMerge.RETRY_SUCCESS_STATUS);
//        entity.setRetryTime(successPayTime);
//        entity.setWalletOffset(walletOffset);
//        entity.setPayDesc(notice.getPayDesc());
//        truckDeductionRecordMergeMapper.updateById(entity);
//        //扣费成功同步更新状态
//        log.info("货车预付卡-微信重试扣款成功-通行记录更新成功：entity={}",entity);
//    }
//
//    private void truckSubUpdate(OrderNoticeDto notice, Integer walletOffset, Integer successStatus, Date successPayTime) {
//        TruckDeductionRecordSub entity = new TruckDeductionRecordSub();
//        entity.setId(notice.getId());
//        entity.setPaySuccessTime(successPayTime);
//        entity.setPayStatus(successStatus);
//        entity.setPayChannel(TruckDeductionRecord.CHANNEL_WX);
//        entity.setRetryStatus(TruckDeductionRecordMerge.RETRY_SUCCESS_STATUS);
//        entity.setRetryTime(successPayTime);
//        entity.setWalletOffset(walletOffset);
//        entity.setPayDesc(notice.getPayDesc());
//        truckDeductionRecordSubMapper.updateById(entity);
//        //扣费成功同步更新状态
//        log.info("货车预付卡-微信重试扣款成功-通行记录更新成功：entity={}",entity);
//    }
//
//    private void truckUpdate(OrderNoticeDto notice, Integer walletOffset, Integer successStatus, Date successPayTime) {
//        TruckDeductionRecord entity = new TruckDeductionRecord();
//        entity.setId(notice.getId());
//        entity.setPaySuccessTime(successPayTime);
//        entity.setPayStatus(successStatus);
//        entity.setPayChannel(TruckDeductionRecord.CHANNEL_WX);
//        entity.setRetryStatus(TruckDeductionRecordMerge.RETRY_SUCCESS_STATUS);
//        entity.setRetryTime(successPayTime);
//        entity.setWalletOffset(walletOffset);
//        entity.setPayDesc(notice.getPayDesc());
//        truckDeductionRecordDao.update(entity);
//        //扣费成功同步更新状态
//        log.info("货车预付卡-微信重试扣款成功-通行记录更新成功：entity={}",entity);
//    }
//
//    private void carWXDeductionRetry(OrderNoticeDto notice) {
//        log.info("扣款通知-扣款重试处理-客车微信扣款 notice={}",notice);
//        //预付卡客车处理重试  凡是失败的都进入重试  由重试觉得是否终止重试
//        Integer retryStatus = null;
//        Date retryTime = null;
//        if (CarDeductionRecord.PAY_STATUS_SUCCES.equals(notice.getPayStatus())) {
//            //如果是支付成功 在重试状态 设置为重试成功
//            retryStatus = CarDeductionRecord.RETRYING_STATUS.equals(notice.getRetryStatus())
//                    ? CarDeductionRecord.RETRY_SUCCESS_STATUS : notice.getRetryStatus();
//            retryTime = CarDeductionRecord.PAY_STATUS_SUCCES.equals(notice.getPayStatus()) ? notice.getPaySuccessTime() : null;
//        } else if (CarDeductionRecord.PAY_STATUS_FAIL.equals(notice.getPayStatus())) {
//            //如果失败 是默认状态 就设置为重试
//            retryStatus = CarDeductionRecord.DEFAULT_STATUS.equals(notice.getRetryStatus()) ?  CarDeductionRecord.RETRYING_STATUS : notice.getRetryStatus();
//            //验证微信代扣的错误信息
//            String filterPayDescStr = carDeductionRecordServiceImpl.getFilterPayDescStr();
//            JSONArray payDescArray = JSONObject.parseArray(filterPayDescStr);
//            if (payDescArray.contains(notice.getPayDesc())) {
//                log.warn("微信代扣返回错误信息验证,订单无法再次重试,设置订单停止重试,等待钱包补偿,deductionRecord={},payDesc={}", JSONObject.toJSONString(notice),notice.getPayDesc());
//                mailServiceUtil.sendMail(toEmil, "预付卡客车-微信扣费失败,微信代扣返回错误信息验证,订单无法再次重试,设置订单停止重试,等待钱包补偿"
//                                + "deductionRecord=" + JSONObject.toJSONString(notice) + ",代扣申请返回描述=" + notice.getPayDesc()
//                                + "请核对处理",
//                        "【预付卡客车微信代扣】微信代扣失败关闭重试预警");
//                //无法再次重试扣费,设置重试状态为停止
//                retryStatus = CarDeductionRecord.RETRY_STOP_STATUS;
//            }
//        }
//        CarDeductionRecord entity = new CarDeductionRecord();
//        entity.setId(notice.getId());
//        entity.setRetryStatus(retryStatus);
//        entity.setRetryTime(retryTime);
//        entity.setUpdateTime(new Date());
//        carDeductionRecordDao.update(entity);
//    }
}
